package xdpm.nhom16.helper;

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Pattern;

import xdpm.nhom16.R;
import xdpm.nhom16.DAO.DichVuDAO;
import xdpm.nhom16.DAO.MySQLiteHelper;
import xdpm.nhom16.GUI.DanhSachKetQua;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.widget.Toast;

public final class Utilities {
	public final static HashMap<Character, Character> dictionary = new HashMap<Character, Character>();
	static {
		// Bắt đầu Khởi tạo từ điển
		dictionary.put('á', 'a');
		dictionary.put('à', 'a');
		dictionary.put('ả', 'a');
		dictionary.put('ã', 'a');
		dictionary.put('ạ', 'a');
		dictionary.put('â', 'a');
		dictionary.put('ấ', 'a');
		dictionary.put('ầ', 'a');
		dictionary.put('ẩ', 'a');
		dictionary.put('ẫ', 'a');
		dictionary.put('ậ', 'a');
		dictionary.put('ă', 'a');
		dictionary.put('ắ', 'a');
		dictionary.put('ằ', 'a');
		dictionary.put('ẳ', 'a');
		dictionary.put('ẵ', 'a');
		dictionary.put('ặ', 'a');
		dictionary.put('é', 'e');
		dictionary.put('è', 'e');
		dictionary.put('ẻ', 'e');
		dictionary.put('ẽ', 'e');
		dictionary.put('ẹ', 'e');
		dictionary.put('ê', 'e');
		dictionary.put('ế', 'e');
		dictionary.put('ề', 'e');
		dictionary.put('ể', 'e');
		dictionary.put('ễ', 'e');
		dictionary.put('ệ', 'e');
		dictionary.put('í', 'i');
		dictionary.put('ì', 'i');
		dictionary.put('ỉ', 'i');
		dictionary.put('ĩ', 'i');
		dictionary.put('ị', 'i');
		dictionary.put('ó', 'o');
		dictionary.put('ò', 'o');
		dictionary.put('ỏ', 'o');
		dictionary.put('õ', 'o');
		dictionary.put('ọ', 'o');
		dictionary.put('ô', 'o');
		dictionary.put('ố', 'o');
		dictionary.put('ồ', 'o');
		dictionary.put('ổ', 'o');
		dictionary.put('ỗ', 'o');
		dictionary.put('ộ', 'o');
		dictionary.put('ơ', 'o');
		dictionary.put('ớ', 'o');
		dictionary.put('ờ', 'o');
		dictionary.put('ở', 'o');
		dictionary.put('ỡ', 'o');
		dictionary.put('ợ', 'o');
		dictionary.put('ú', 'u');
		dictionary.put('ù', 'u');
		dictionary.put('ủ', 'u');
		dictionary.put('ũ', 'u');
		dictionary.put('ụ', 'u');
		dictionary.put('ư', 'u');
		dictionary.put('ứ', 'u');
		dictionary.put('ừ', 'u');
		dictionary.put('ử', 'u');
		dictionary.put('ữ', 'u');
		dictionary.put('ự', 'u');
		dictionary.put('ý', 'y');
		dictionary.put('ỳ', 'y');
		dictionary.put('ỷ', 'y');
		dictionary.put('ỹ', 'y');
		dictionary.put('ỵ', 'y');
		dictionary.put('đ', 'd');
		// Kết thúc Khởi tạo từ điển
	}

	/**
	 * Định dạng lại chuổi chống injection và chuyển đội các kí tự tiếng việt
	 * thành tiếng chử cái không dấu,replace nhiều khoảng trắng bằng một khoảng
	 * trắng
	 * 
	 * @param input
	 * @return một chuổi đã định dạng
	 */
	public static String formatInputData(final String input) {
		String result = "";
		StringBuilder temp1 = new StringBuilder();
		try {
			String temp2 = input;
			temp2 = temp2.trim().toLowerCase();
			int n = temp2.length();
			int i = 0;
			while (i < n) {
				char key = temp2.charAt(i);
				if (dictionary.containsKey(key)) {
					temp1.append(dictionary.get(key));
				} else {
					temp1.append(key);
				}
				i++;
			}
			result = new String(temp1);
			result = result.replaceAll("[\\W]", " ");
			result = result.replaceAll("\\s+", " ");
		} catch (Exception ex) {

		}
		return result.trim();
	}

	private static final Pattern numberPattern = Pattern.compile("\\d");

	/**
	 * Kiểm tra trong chuổi có số hay không
	 * 
	 * @param s
	 * @return true nếu tồn tại số trong chuổi
	 */

	public final static boolean isExistNumbers(final String s) {
		boolean res = false;
		try {
			res = numberPattern.matcher(s).find();
		} catch (Exception ex) {
		}
		return res;
	}

	/**
	 * Lấy ra tất cả các số nguyên(Kieu Integer) trong chuổi input
	 * 
	 * @param input
	 * @return mảng kết quả không chứa giá trị null, hoặc null nếu mảng không
	 *         chứa số nguyên nào
	 */
	public final static Integer[] getNumbersInString(final String input) {
		ArrayList<Integer> temp1 = new ArrayList<Integer>();
		String temp2[] = input.split("\\D+");
		for (String s : temp2) {
			try {
				Integer a = Integer.valueOf(s);
				if (a != null)
					temp1.add(a);
			} catch (Exception e1) {
			}
		}

		return listIntegerToArray(temp1);
	}

	/**
	 * @param list
	 * @return chú ý return null nếu list rổng
	 */
	public static <T> Integer[] listIntegerToArray(ArrayList<Integer> list) {
		Integer[] result = null;
		int n = list.size();
		if (n > 0) {
			result = new Integer[n];
			for (int i = 0; i < n; i++) {
				result[i] = list.get(i);
			}
		}
		return result;
	}

	/**
	 * Tạo một điều kiện truy vấn dựa trên một mảng giá trị
	 * 
	 * @param columnName
	 * @param params
	 * @return một mảng string chưa format (chống injection ...), hoặc một chuổi
	 *         rổng nếu params không chứa phần tử nào. hàm không throw exception
	 */
	public final static String generateSelection(final String columnName,
			final Object[] params) {
		String selection = "";
		if (params != null) {
			for (Object x : params) {
				String temp = String.format("%s='%s' OR ", columnName,
						String.valueOf(x));
				selection += temp;
			}
			int lastOfOr = selection.lastIndexOf("OR");
			if (lastOfOr != -1) {
				selection = selection.substring(0, lastOfOr);
			}
		}
		return selection.trim();
	}

	/**
	 * 
	 * @param s
	 * @param strClear
	 * @return Nếu strClear khác null hoặc rổng thì : nếu strClear chứa s hàm
	 *         trả về chuổi rổng, nếu strClear không chứa s return về một chuổi
	 *         bằng s remove hết strClear trong nó. Còn nếu không thì return về
	 *         chuổi s
	 */
	public final static String clear(String s, String strClear) {
		String res = "";
		if (strClear != null && strClear.length() > 0) {
			if (strClear.indexOf(s) == -1) {
				res = s.replace(strClear, "");
				res.trim();
			}
		} else {
			res = s;
		}
		return res.trim();
	}

	public static Drawable LoadImageFromWeb(String url) {
		Drawable result = null;
		try {
			InputStream is = (InputStream) new URL(url).getContent();
			result = Drawable.createFromStream(is, "map");
		} catch (Exception e) {
			result = null;
		}
		return result;
	}

	public static void onClickButtonSearch(String strQuery, Context mContext) {

		if (strQuery.equals("")) {
			Toast.makeText(mContext, R.string.error_message_empty_query,
					Toast.LENGTH_LONG);
		} else {
			Intent intent = new Intent();
			intent.setClass(mContext, DanhSachKetQua.class);
			intent.putExtra("SearchQuery", strQuery);
			mContext.startActivity(intent);
		}
	}

	public static Bitmap[] dichVuIcon =null;
	public static Bitmap[] getDichVuIcon(Context mContext) {
		if (dichVuIcon == null){
			dichVuIcon = new Bitmap[] {
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.hospital),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.school),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.coffee),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.hamburger),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.atm),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.gas_station),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.shopping_bag),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.scirssor),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.karaoke),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.restaurant),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.hotel),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.park),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.shopping_cart),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.movies),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.stadium),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.delivery),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.stethoscope),
					BitmapFactory.decodeResource(mContext.getResources(),
							R.drawable.bus_stop),
							null,null,null,null,null,null,null,null,null};
		}
		return dichVuIcon;
	}

	public static int getMaDichVu(String tenDichVu, Context mContext) {
		int result = -1;
		MySQLiteHelper dbHelper = new MySQLiteHelper(mContext);
		SQLiteDatabase db = dbHelper.getReadableDatabase();

		DichVuDAO daoDichVu = new DichVuDAO(db);
		result = daoDichVu.GetIdByName(tenDichVu);
		return result;
	}
}
